// app/api/projects/[projectId]/route.ts import { NextRequest, NextResponse } from 'next/server'; import { getServerSession } from 'next-auth/next'; import { authOptions } from '@/app/api/auth/[...nextauth]/route' import { ProjectService } from '@/lib/services/projectService'; import { z } from 'zod'; // GET: 프로젝트 정보 조회 export async function GET( request: NextRequest, { params }: { params: Promise<{ projectId: string }> } ) { try { const { projectId } = await params; const session = await getServerSession(authOptions); if (!session?.user) { return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); } const projectService = new ProjectService(); // 프로젝트 접근 권한 확인 const access = await projectService.checkProjectAccess( projectId, Number(session.user.id) ); if (!access.hasAccess) { return NextResponse.json( { error: '프로젝트에 접근할 수 없습니다' }, { status: 403 } ); } // 프로젝트 정보 가져오기 const project = await projectService.getProject(projectId); if (!project) { return NextResponse.json( { error: '프로젝트를 찾을 수 없습니다' }, { status: 404 } ); } // 사용자의 역할과 함께 프로젝트 정보 반환 return NextResponse.json({ ...project, role: access.role, isOwner: access.isOwner, }); } catch (error) { console.error('프로젝트 조회 오류:', error); return NextResponse.json( { error: '프로젝트 정보를 불러올 수 없습니다' }, { status: 500 } ); } } // PATCH: 프로젝트 정보 수정 export async function PATCH( request: NextRequest, { params }: { params: { projectId: string } } ) { try { const session = await getServerSession(authOptions); if (!session?.user) { return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); } const body = await request.json(); const projectService = new ProjectService(); // Admin 이상 권한 확인 const access = await projectService.checkProjectAccess( params.projectId, Number(session.user.id), 'admin' ); if (!access.hasAccess) { return NextResponse.json( { error: '프로젝트를 수정할 권한이 없습니다' }, { status: 403 } ); } await projectService.updateProjectSettings( params.projectId, Number(session.user.id), body ); return NextResponse.json({ success: true }); } catch (error) { console.error('프로젝트 수정 오류:', error); return NextResponse.json( { error: '프로젝트 수정에 실패했습니다' }, { status: 500 } ); } } // DELETE: 프로젝트 삭제 export async function DELETE( request: NextRequest, { params }: { params: { projectId: string } } ) { try { const session = await getServerSession(authOptions); if (!session?.user) { return NextResponse.json({ error: '인증이 필요합니다' }, { status: 401 }); } const projectService = new ProjectService(); // Owner만 삭제 가능 await projectService.deleteProject(params.projectId, session.user.id); return NextResponse.json({ success: true }); } catch (error: any) { if (error.message.includes('소유자')) { return NextResponse.json( { error: error.message }, { status: 403 } ); } console.error('프로젝트 삭제 오류:', error); return NextResponse.json( { error: '프로젝트 삭제에 실패했습니다' }, { status: 500 } ); } }